home *** CD-ROM | disk | FTP | other *** search
- ; .VERBOSE
-
- INCLUDE HGMacs.Txt
- INCLUDE Traps.D
- INCLUDE SysEquX.D
- INCLUDE ToolEqu.D
- INCLUDE FSEqu.D
- .TRAP _DebugStr $ABFF
- .TRAP _SCSIDispatch $A815
- scsiStat EQU 10
- .MACRO _SCSIStat
- MOVE.W #scsiStat,-(A7)
- _SCSIDispatch
- .ENDM
-
- sndRefNum EQU -4
- buffsize EQU 512*22
- N EQU 8 ;number of buffers
- vblSize EQU vblPhase+2
- ffMode EQU 0
-
- RECORD 0,INCREMENT
- extlen$ VAR 4
- MACRO extlen =| ;use (An) addressing
- extptr VAR 4
- rate VAR 4
- datahndl VAR 4
- codehndl VAR 4
- taskcount VAR 2
- ALGN 0,4 ;for '020 efficiency
- hdrsize ENDR
-
- RECORD 0,INCREMENT
- FILL ioQElSize
- vblQEl1 VAR vblSize
- sndPB VAR ioQElSize
- vblQEl2 VAR vblSize
- FILL 4 ;for rate -- mode overlaps vblPhase
- readbuff VAR buffsize
- overrun VAR 368
- ALGN 0,4 ;for '020 efficiency
- blksize ENDR
-
- ratevalue EQU $00010000
-
- RESOURCE 'sysz' 0
- DC.L (codeend-codestart)+1024+hdrsize+N*blkSize
-
-
- RESOURCE 'INIT' 128 'AsyncInit' 1<<resSysHeap+1<<resLocked
- codestart
- JMP install
- DC.W 'Copyright © 1990 Harvey Grosser'
-
-
- readcomp:
-
- countR EQU D1
- MACRO extR =D2| ;EQU doesn't work properly in MOVEM or index reg.
-
- MOVE.L A3,-(A7)
- MOVE.L ioOwnBuf(A0),A3
- MOVEM.L extlen(A3),extR/A1
- MOVE.L ioActCount(A0),countR
- CMP.L extR,countR
- BGT.S @gtov
-
- SUBQ.W #1,taskcount(A3)
- BNE.S @more
- MEA1 closed,ioCompletion(A0)
- _Close ,ASYNC
- BRA.S @restore
-
- @more
- LEA readbuff(A0),A0
- MOVE.L countR,D0
- _BlockMove
- MOVE.L D0,extlen(A3) ;better than CLR.L on 68000
- ADDA.L countR,A1
- SUB.L countR,extR
-
- MOVE.L #$80808080,D0
- MOVEQ #3,countR
- AND.W extR,countR
- BRA.S @1
- @0 MOVE.B D0,(A1)+
- @1 DBRA countR,@0
- LSR.W #3,extR
- BCS.S @3
- BRA.S @4
- @2 MOVE.L D0,(A1)+
- @3 MOVE.L D0,(A1)+
- @4 DBRA extR,@2
-
- BRA.S @restore
- @gtov
- ;amount read is greater than previous overrun
- LEA readbuff(A0),A0
- MOVE.L extR,D0
- _BlockMove
- LEA -6(A0,extR),A1
- LEA sndPB-readbuff(A0),A0
- MOVE.L A1,ioBuffer(A0)
- MOVE.W D0,(A1)+ ;D0 = 0 (ffMode) from BlockMove
- MOVE.L rate(A3),(A1)+
- SUB.L extR,countR ;amount left in buffer
- ADDA.L countR,A1 ;point beyond data just read
- MOVE.L #370<<16,extR ;largest possible dividend + 1
- SUB.L countR,extR
- DIVU #370,extR
- CLR.W extR
- SWAP extR
- ADD.L extR,countR
-
- MOVE.L countR,ioReqCount(A0)
- _Write ,ASYNC
-
- MOVEM.L extR/A1,extlen(A3)
- @restore
- MOVE.L (A7)+,A3
- RTS
-
- closed
- MOVE.L ioOwnBuf(A0),A1
- MOVE.L datahndl(A1),A0
- _HUnlock
- _HPurge
- MOVE.L codehndl(A1),A0
- _HUnlock
- _HPurge
- RTS
-
-
- sndcomp:
- BEQ.S @nokill ;test for _KillIO
- CLR.L ioReqCount-sndPB(A0) ;terminate on _KillIO
- @nokill MOVE.B #$80,SoundLevel ;eliminate end click on Mac SE
- TST.B FSBusy
- BNE.S @read
- LEA vblQEl1-sndPB(A0),A0
- ADDQ.W #1,vblCount(A0)
- _VInstall
- RTS
- @read
- LEA -sndPB(A0),A0
- _Read ,ASYNC
- RTS
-
-
- vbltask1:
- TST.B FSBusy
- BNE.S @read
- MOVE.L A0,A2
- SUBQ #2,A7
- _SCSIStat
- TST.W (A7)+
- BEQ.S @scsifree
- ADDQ.W #1,vblCount(A2)
- RTS
- @scsifree
- LEA vblQEl2-vblQEl1(A2),A0
- LEA VBLQueue,A1
- _Enqueue
- RTS
- @read
- LEA -vblQEl1(A0),A0
- _Read ,ASYNC
- RTS
-
-
- vbltask2:
- _VRemove ;-> D0 = 0
- BCLR #inVBL,VBLQueue+qFlags
- CLR.L (A0) ;qLink
- ADDQ.W #1,vblCount(A0)
- LEA -vblQEl2(A0),A0
- _Read ,ASYNC
- RTS
- compend
-
-
- openerr:
- MOVE.L datahndl(A3),A0
- MOVE.L D0,D1
- _DisposHandle
- MOVE.L D1,D0
- nomem:
- NEG.W D0
- MOVE.W D0,-(A7)
- _SysBeep
- RTS
-
- install:
- _HLock
- MOVE.L A0,D6
- MOVE.L #hdrsize+N*blkSize,D0
- MOVE.L D0,D1
- _ResrvMem ,SYS
- MOVE.L D1,D0
- _NewHandle ,SYS
- BNE nomem
- _HLock ;returns D0.L = 0
- MOVEA.L (A0),A3
- MOVE.L A3,A2
- MOVEQ #(hdrsize+readbuff)/4-1,D1
- @clr MOVE.L D0,(A2)+ ;faster than CLR.L
- DBRA D1,@clr ;A2 points to readbuff
-
- MOVE.W #N,taskcount(A3)
- MOVE.L A0,datahndl(A3)
- MOVE.L D6,codehndl(A3)
- MOVE.L #ratevalue,rate(A3)
-
- LEA hdrsize(A3),A0
- MEA1 'StartupSound',ioFileName(A0)
- MOVE.B #fsRdPerm,ioPermssn(A0)
- _HOpen ;we'll eventually specify a DirID
- BNE openerr
- MEA1 readcomp,ioCompletion(A0)
- MOVE.L A3,ioOwnBuf(A0)
- MOVE.L A2,ioBuffer(A0) ;points to readbuff
- MOVE.L #buffsize,ioReqCount(A0)
- ; ;CLR.W ioPosMode(A0) ;= fsAtMark
- MOVE.W #sndRefNum,sndPB+ioRefNum(A0)
- MEA1 sndcomp,sndPB+ioCompletion(A0)
- ADDQ.W #vType,vblQEl1+qType(A0)
- ADDQ.W #vType,vblQEl2+qType(A0)
- MEA1 vbltask1,vblQEl1+vblAddr(A0)
- MEA1 vbltask2,vblQEl2+vblAddr(A0)
- ADDQ.W #1,vblQEl2+vblCount(A0)
-
- _Read ,ASYNC
- MOVEQ #N-2,D1
- MOVE.L #blksize,D5
- @top
- MOVE.L #readbuff,D0
- LEA 0(A0,D5.L),A1
- _BlockMove
- ADD.L D5,ioBuffer(A1)
- MOVE.L A1,A0
- _Read ,ASYNC
- DBRA D1,@top
- MOVE.L D6,-(A7)
- _DetachResource
- MOVE.L D6,A0
- MOVE.L #compend-codestart,D0
- _SetHandleSize
- RTS
- codeend
- END
-
-